package model.proveedor;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.*;

import constats.CondicionesVentaConst;

import persistence.controllers.HbtCondicionVentaController;
import persistence.controllers.HbtRodamientoController;

import dtos.CondicionVentaDTO;
import dtos.FinanciacionDTO;
import dtos.ItemListaPrecioDTO;
import dtos.ListaPrecioDTO;
import model.Rodamiento;
import model.condicionesVenta.CondicionVenta;
import model.condicionesVenta.Financiacion;
import model.condicionesVenta.PagoContado;

@Entity
@Table(name="ListasPrecios")
public class ListaPrecio {

	@Id
	@Column(name="nroLista")
	private int nro;
	
	private Date fechaPublicacion;
	
	private String termino;
	
	private String tipo;
	
	private int listaReemplazada;
	
	@ManyToMany (cascade=CascadeType.ALL)
	@JoinTable(name="CondicionesVenta_ItemsListaPrecio", 
			joinColumns= {@JoinColumn(name="nroListaPrecio")},
			inverseJoinColumns = { @JoinColumn(name = "idCondicion")})
	private Set<CondicionVenta> condiciones;
	
	@OneToMany (cascade=CascadeType.ALL)
    @JoinColumn(name="nroLista")
	private Set<ItemListaPrecio> items;
	
	public ListaPrecio()
	{
		condiciones = new HashSet<CondicionVenta>();
		items = new HashSet<ItemListaPrecio>();
	}
	
	public ListaPrecio(int nro, Date fechaPublicacion, String termino, String tipo, int listaReemplazada)
	{
		this.nro = nro;
		this.fechaPublicacion = fechaPublicacion;
		this.termino = termino;
		this.tipo = tipo;
		this.listaReemplazada = listaReemplazada;
		condiciones = new HashSet<CondicionVenta>();
		items = new HashSet<ItemListaPrecio>();
	}	
	
	public ListaPrecio(ListaPrecioDTO listaDto)
	{
		this.nro = listaDto.nro;
		this.fechaPublicacion = listaDto.fechaPublicacion;
		this.termino = listaDto.termino;
		this.tipo = listaDto.tipo;
		this.listaReemplazada = listaDto.listaReemplazada;
		
		condiciones = new HashSet<CondicionVenta>();
		for(CondicionVentaDTO condicionDto : listaDto.condiciones)
		{
			CondicionVenta condicion = null;
			if (condicionDto.getTipo().equals(CondicionesVentaConst.FINANCIACION))
				condicion = HbtCondicionVentaController.getInstance().buscarCondicion(condicionDto.porcentaje, condicionDto.esDescuento, ((FinanciacionDTO)condicionDto).dias, condicionDto.getTipo());
			else if (condicionDto.getTipo().equals(CondicionesVentaConst.PAGOCONTADO))
				condicion = HbtCondicionVentaController.getInstance().buscarCondicion(condicionDto.porcentaje, condicionDto.esDescuento, 0, condicionDto.getTipo());
		
			//No existe en la BD
			if (condicion == null)
				if (condicionDto.getTipo().equals(CondicionesVentaConst.FINANCIACION))
					condicion = new Financiacion(condicionDto.porcentaje, condicionDto.esDescuento, ((FinanciacionDTO)condicionDto).dias, condicionDto.descripcion);
				else if (condicionDto.getTipo().equals(CondicionesVentaConst.PAGOCONTADO))
					condicion = new PagoContado(condicionDto.porcentaje, condicionDto.esDescuento, condicionDto.descripcion);
		
			condiciones.add(condicion);
		}
		
		items = new HashSet<ItemListaPrecio>();
		for(ItemListaPrecioDTO itemDto : listaDto.items)
		{
			Rodamiento rodamiento = HbtRodamientoController.getInstance().buscarRodamiento(itemDto.nroSerie, itemDto.sufijo, itemDto.origen, itemDto.marca);
			if(rodamiento != null)
			{				
				//Verificar si hay que crear un Rodamiento que no exista
				ItemListaPrecio item = new ItemListaPrecio(rodamiento, itemDto.precio);
				items.add(item);
			}
		}
	}
	
	public int getNro() {
		return nro;
	}

	public void setNro(int nro) {
		this.nro = nro;
	}

	public Date getFechaPublicacion() {
		return fechaPublicacion;
	}

	public void setFechaPublicacion(Date fechaPublicacion) {
		this.fechaPublicacion = fechaPublicacion;
	}

	public String getTermino() {
		return termino;
	}

	public void setTermino(String termino) {
		this.termino = termino;
	}

	public void setCondiciones(Set<CondicionVenta> condiciones) {
		this.condiciones = condiciones;
	}
	
	public void addCondicion(CondicionVenta condicion) {
		this.condiciones.add(condicion);
	}
	
	public Set<CondicionVenta> getCondiciones() {
		return condiciones;
	}
	
	public void setItems(Set<ItemListaPrecio> items) {
		this.items = items;
	}
	
	public void addItem(ItemListaPrecio item) {
		this.items.add(item);
	}
	
	public Set<ItemListaPrecio> getItems() {
		return items;
	}
	
	public String getTipo() {
		return tipo;
	}

	public void setTipo(String tipo) {
		this.tipo = tipo;
	}

	public int getListaReemplazada() {
		return listaReemplazada;
	}

	public void setListaReemplazada(int listaReemplazada) {
		this.listaReemplazada = listaReemplazada;
	}

	public ListaPrecioDTO getView()
	{
		ListaPrecioDTO dto = new ListaPrecioDTO(this.nro, this.fechaPublicacion, this.termino, this.tipo, this.listaReemplazada);
		
		for (CondicionVenta condicion : this.condiciones){
			dto.addCondicion(condicion.getView());
		}
		
		for (ItemListaPrecio item : this.items){
			dto.addItem(item.getView());
		}
		
		return dto;
	}
}
